﻿#region License
// Copyright 2009 Buu Nguyen (http://www.buunguyen.net/blog)
// 
// Licensed under the Apache License, Version 2.0 (the "License"); 
// you may not use this file except in compliance with the License. 
// You may obtain a copy of the License at 
// 
// http://www.apache.org/licenses/LICENSE-2.0 
// 
// Unless required by applicable law or agreed to in writing, software 
// distributed under the License is distributed on an "AS IS" BASIS, 
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
// See the License for the specific language governing permissions and 
// limitations under the License.
// 
// The latest version of this file can be found at http://dotcommon.codeplex.com
#endregion

using System;
using System.Security.Cryptography;
using System.Text;

namespace DotCommon.Encryption
{
    public static class EncryptionExtensions
    {
        private static readonly string Salt = Guid.NewGuid().ToString();

        /// <summary>
        /// Get the SHA512 hash (with salt) for a the given <paramref name="input"/>.
        /// Can be used to hash passwords to store in database.
        /// </summary>
        /// <param name="input">The string whose hash is to be computed</param>
        /// <returns>The hash (with salt) for <paramref name="input"/></returns>
        public static string GetHash(this string input)
        {
            return input.GetHash(true);
        }

        /// <summary>
        /// Get the SHA512 hash for a the given <paramref name="input"/>.
        /// Can be used to hash passwords to store in database.
        /// </summary>
        /// <param name="input">The string whose hash is to be computed</param>
        /// <param name="withSalt">Specify whether salt is to be added or not to the hash</param>
        /// <returns>The hash for <paramref name="input"/></returns>
        public static string GetHash(this string input, bool withSalt)
        {
            if (input == null)
                throw new ArgumentNullException("input");
            var salt = (withSalt ? Salt : string.Empty);
            byte[] data = Encoding.ASCII.GetBytes(input + salt);
            var sha = new SHA512Managed();
            data = sha.ComputeHash(data);

            var sb = new StringBuilder();
            foreach (var b in data)
            {
                sb.Append(b.ToString("x2"));
            }
            return sb.ToString();
        }
    }
}
